package com.acmen.ump.core.dto;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.util.List;

/**
 * @author Acmen
 * @ClassName ApiResponse.java
 * @Description 响应结果需要用该类进行包装
 *   Restful API 返回JSON结果: { "code":0, "message":"成功","errors": [ErrorEntity],"data":T }
 * @CreateTime 2019年08月23日 14:40:08
 */
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ApiResponse<T> {
    /**
     * 系统状态
     */
    @JsonProperty("code")
    private Integer code;
    /**
     * 错误消息
     */
    @JsonProperty("message")
    private String message;
    /**
     * 错误内容列表
     */
    @JsonProperty("errors")
    private List<ErrorEntity> errors;

    /**
     * 返回结果内容
     */
    private T data;

    /**
     * 成功，没数据
     */
    public ApiResponse() {
        this(ApiResponseErrorCode.CODE_0.getCode(),
                ApiResponseErrorCode.CODE_0.getMessage(), null, null);
    }

    /**
     * 成功，有数据
     */
    public ApiResponse(T data) {
        this(ApiResponseErrorCode.CODE_0.getCode(),
                ApiResponseErrorCode.CODE_0.getMessage(), data, null);
    }

    /**
     * 指定code/message
     */
    public ApiResponse(ApiResponseErrorCode apiResponseErrorCode) {
        this(apiResponseErrorCode.getCode(), apiResponseErrorCode.getMessage(),
                null, null);
    }

    /**
     * 指定code + data
     */
    public ApiResponse(ApiResponseErrorCode apiResponseErrorCode, T data) {
        this(apiResponseErrorCode.getCode(), apiResponseErrorCode.getMessage(),
                data, null);
    }

    /**
     * 指定code + errors
     */
    public ApiResponse(ApiResponseErrorCode apiResponseErrorCode,
                       List<ErrorEntity> errors) {
        this(apiResponseErrorCode.getCode(), apiResponseErrorCode.getMessage(),
                null, errors);
    }

    protected ApiResponse(Integer code, String message, T data,
                          List<ErrorEntity> errors) {
        this.code = code;
        this.message = message;
        this.errors = errors;
        this.data = data;
    }
}
